/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package CapaDatos;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;

/**
 *
 * @author Usuario
 */
public class ListaReserva implements ListaTreeSet{


    private SortedSet <Reserva> nodoReserva;
    private Comparator ComparadorIdReserva;

    public Comparator getComparadorIdReserva() {
        return ComparadorIdReserva;
    }

    public void setComparadorIdReserva(Comparator ComparadorIdReserva) {
        this.ComparadorIdReserva = ComparadorIdReserva;
    }

    public SortedSet<Reserva> getNodoReserva() {
        return nodoReserva;
    }

    public void setNodoReserva(SortedSet<Reserva> nodoReserva) {
        this.nodoReserva = nodoReserva;
    }


      public ListaReserva()
    {
        /*
         Se incializa el comparadorApellido con su constructor y
         * se le pasa al nodoCliente para conocer el criterio
         * de ordenamiento de la lista
         */
        ComparadorIdReserva = new CompararIdReserva();
        nodoReserva= new TreeSet(ComparadorIdReserva);
    }


    /**
     *Metodo que imprime el contenido de la coleccion
     *
     */
    public void imprimirColeccion()
    {
        int i;
        Reserva registroReserva;


        /*
         * Se define un arreglo de tipo Object (la clase generica Java)
         */
        Object [] arregloReserva;



        /*
         * Se convierte la coleccion pasada como parametro a un array, que
         * es asignado al arreglo de tipo Object
         */
        arregloReserva = nodoReserva.toArray();


        System.out.println("DATOS RESERVA");
        System.out.println("-------------");

        /*
         * Se hace un recorrido del arreglo de tipo Object y se imprime
         * la informacion de la casilla i
         */
        for(i=0 ; i<arregloReserva.length ; i++)
        {
            registroReserva = (Reserva) arregloReserva[i];
            System.out.println("Fecha Inicio: " + registroReserva.getFechaInicio());
            System.out.println("Fecha Fin: " + registroReserva.getFechaFin());
            System.out.println();
        }

    }


    /**
     *
     * Metodo public boolean agregarElemento(Nodo objeto): Este metodo agrega
     * el Nodo "objeto" a la coleccion ListaReserva
     */
    public boolean agregarElemento(Object objeto)
    {
        Reserva laReserva = (Reserva) objeto;
        laReserva.setID(laReserva.getID());
        return nodoReserva.add(laReserva);
    }


    /**
     *
     * Metodo public boolean removerElemento(Nodo objeto): Este metodo elimina
     * el Nodo "objeto" de la coleccion nodoReserva
     */
    public boolean removerElemento(Object objeto)
    {
        Reserva laReserva = (Reserva) objeto;
        boolean encontrado = false;
        Reserva auxiliar = null;

        /*
         * Se define un iterador inicializado con el iterador de la coleccion
         */
        Iterator iterador = nodoReserva.iterator();

        /*
         * Mientras no se encuentre el elemento y existan mas elementos en la
         * coleccion, se sigue entrando en el ciclo
         */
        while (!encontrado && iterador.hasNext())
        {
            /*
             *  Se obtiene el siguiente objeto del iterador y se le hace un cast
             *  para asignarlo al objeto de tipo Nodo
             */
            auxiliar = (Reserva) iterador.next();

            /*
             * Se invoca al mÃ©todo equals de la clase Nodo para determinar si son
             * iguales. En caso de serlo, se encontrÃ³ el elemento buscado
             */
            if (laReserva.equals(auxiliar))
                encontrado = true;
        }

        /*
         * Si se encontro el elemento, se procede a ejecutar el remove
         */
        if (encontrado)
        {
            if (nodoReserva.remove(auxiliar))
                return true;
        }

        return false;
    }


    public Reserva BuscarReserva (String cedula, int id)
        {
             boolean encontrado = Boolean.FALSE;
             Reserva auxiliar = null;


               Iterator iterador = nodoReserva.iterator();


        while (!encontrado && iterador.hasNext())
        {

            auxiliar = (Reserva) iterador.next();

            if (auxiliar.getElCliente().getCedula().equals(cedula) == true && auxiliar.getID() == id)
            {
                encontrado=Boolean.TRUE;
                return auxiliar;
            }

          }
            return null;
        }

        public Reserva BuscarReserva (Integer id)
        {
             boolean encontrado = Boolean.FALSE;
             Reserva auxiliar = null;


               Iterator iterador = nodoReserva.iterator();


        while (!encontrado && iterador.hasNext())
        {

            auxiliar = (Reserva) iterador.next();

            if (auxiliar.getID() == id)
            {
                encontrado=Boolean.TRUE;
                return auxiliar;
            }

          }
            return null;
        }


        public boolean EstaLaReserva (Integer id)
        {
             boolean encontrado = false;
             Reserva auxiliar = null;


               Iterator iterador = nodoReserva.iterator();


        while (!encontrado && iterador.hasNext())
        {

            auxiliar = (Reserva) iterador.next();

            if (auxiliar.getID() == id)
            {
                encontrado= true;
                return encontrado;
            }

          }
            return false;
        }

    public Habitacion buscarHabitacionDeReserva(String idHabitacion)
    {
         boolean encontrado = Boolean.FALSE;
             Reserva auxiliar = null;


               Iterator iterador = nodoReserva.iterator();


        while (!encontrado && iterador.hasNext())
        {

            auxiliar = (Reserva) iterador.next();

            if (auxiliar.getLaHabitacion().getID().equals(idHabitacion))
            {
                encontrado=Boolean.TRUE;
                return auxiliar.getLaHabitacion();
            }

          }
            return null;
    }


    public boolean esFechaValida (String Idhabitacion, String fechaInicio, String fechaFin) throws ParseException
        {
             boolean encontrado = true;
             Reserva auxiliar = null;


               Iterator iterador = nodoReserva.iterator();


        while (encontrado && iterador.hasNext())
        {

            auxiliar = (Reserva) iterador.next();

            if (auxiliar.getLaHabitacion().getID().equals(Idhabitacion) && !validarFecha(fechaInicio,fechaFin,auxiliar.getFechaInicio(),auxiliar.getFechaFin()))
            {
                encontrado = false;
                return encontrado;
            }

          }
            return true;
        }
   public static boolean validarFecha (String fechaInicio, String fechaFin, String fechaIRes, String fechaFRes) throws ParseException
    {
        String DateFormat = "dd/MM/yyyy";
        SimpleDateFormat sdf = new SimpleDateFormat(DateFormat);
        Date c1= sdf.parse(fechaInicio);
        Date c2= sdf.parse(fechaFin);
        Date c3 = sdf.parse(fechaIRes);
        Date c4 = sdf.parse(fechaFRes);

        if (c1.before(c3) && c1.before(c4) && c2.before(c3) && c2.before(c4)) // antes de la fecha
        return true;

        if (c1.after(c3) && c1.after(c4) && c2.after(c3) && c2.after(c4)) // despues de la fecha
         return true;
          else
          return  false;
      }

       public void eliminarReservaPorId (Integer idReserva)
        {
         Reserva auxiliar=null;
         auxiliar= BuscarReserva(idReserva);
         nodoReserva.remove(auxiliar);
        }




}
